#  -*- coding:utf-8 -*- 
"""
@ author: 罗金盛
@ time: 2023/10/19 
@ file: Kmeans英文文本聚类.py

"""
# 导入用于文本特征提取的TF-IDF向量化器
from sklearn.feature_extraction.text import TfidfVectorizer

# 导入用于聚类的KMeans算法
from sklearn.cluster import KMeans

# 以下两个列表是示例数据，其中corpus是文本语料库，labels是对应的标签
corpus = ['The sky is blue and beautiful.',
          'Love this blue and beautiful sky!',
          'The quick brown fox jumps over the lazy dog.',
          'The brown fox is quick and the blue dog is lazy!',
          'The sky is very blue and the sky is very beautiful today',
          'The dog is lazy but the brown fox is quick!']

labels = ['weather', 'weather', 'animals', 'animals', 'weather', 'animals']

# 创建一个TF-IDF向量化器实例，max_features是输出的特征数，这里设置为5000
tfidf_vectorizer = TfidfVectorizer(max_features=5000)

# 使用上面创建的向量化器将文本转化为TF-IDF特征向量 由于这里转化为了向量 所以后面会出现0和1
# fit_transform()函数首先会对数据进行拟合（fit），然后会转换（transform）输入的数据
tfidf_matrix = tfidf_vectorizer.fit_transform(corpus)

# 设置KMeans聚类的簇的数量为2 因为只有两个标签 K-means的标签是从0开始的。random_state参数用于指定随机数生成器的种子，使结果都一样
k = 2
kmeans = KMeans(n_clusters=k, random_state=0)

# 使用上一步创建的KMeans模型对TF-IDF特征向量进行聚类
kmeans.fit(tfidf_matrix)

# 获取每个样本所属的簇的标签，这些标签由KMeans算法计算得出
cluster_labels = kmeans.labels_

# 使用一个for循环打印出每个文本与其所属的簇的标签和预设的标签  0 代表是weather ，1 代表是animals
for i, label in enumerate(labels):
    print(f'Text: "{corpus[i]}", Cluster: {cluster_labels[i]}, Label: {label}')